import JSEncrypt from 'jsencrypt';

/**
 * RSA 加密工具类（与 Hutool RSA/ECB/PKCS1Padding 兼容）
 */
class RsaUtils {
  /**
   * 使用公钥加密文本
   * @param {string} text 要加密的文本
   * @param {string} publicKeyBase64 Base64 编码的公钥
   * @returns {string} Base64 编码的加密结果
   */
  static encrypt(text, publicKeyBase64) {
    try {
      // 创建加密对象
      const encryptor = new JSEncrypt();

      // 将 Base64 公钥转换为 PEM 格式
      const publicKeyPem = this.base64ToPem(publicKeyBase64, 'PUBLIC');

      // 设置公钥
      encryptor.setPublicKey(publicKeyPem);

      // 执行加密（返回 Base64 字符串）
      return encryptor.encrypt(text);
    } catch (error) {
      console.error('RSA 加密失败:', error);
      throw new Error('加密失败');
    }
  }

  /**
   * 将 Base64 密钥转换为 PEM 格式
   * @param {string} base64Key Base64 编码的密钥
   * @param {string} keyType 密钥类型 ('PUBLIC' 或 'PRIVATE')
   * @returns {string} PEM 格式的密钥
   */
  static base64ToPem(base64Key, keyType) {
    const type = keyType.toUpperCase();
    if (type !== 'PUBLIC' && type !== 'PRIVATE') {
      throw new Error('无效的密钥类型');
    }

    const header = `-----BEGIN ${type} KEY-----`;
    const footer = `-----END ${type} KEY-----`;

    // 每 64 字符换行
    const content = base64Key.match(/.{1,64}/g).join('\n');

    return `${header}\n${content}\n${footer}`;
  }
}

export default RsaUtils;
